package com.yang.controller;



import com.yang.annotation.OptLogger;
import com.yang.domain.dto.Result;
import com.yang.domain.dto.ScrollResult;
import com.yang.domain.dto.UserDTO;
import com.yang.domain.entity.Blog;
import com.yang.limit.aop.Limit;
import com.yang.service.IBlogService;

import com.yang.utils.UserHolder;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import static com.yang.constants.OptTypeConstants.UPDATE;


/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author yang
 * @since 2022-10-22
 */
@Api("博客模块")
@RestController
@RequestMapping("/blog")
public class BlogController {

    @Resource
    private IBlogService blogService;
    /**
     * 新增博客功能
     * @param blog 封装的博客信息
     * @return 新增结果
     */
    @PostMapping
    @ApiOperation(value = "查询博客信息")
    public Result saveBlog(@RequestBody Blog blog) {
        // 获取登录用户
        blog.setUserId(UserHolder.getUser().getId());
        // 保存探店博文
        Long blogId = blogService.saveBlog(blog);

        return Result.ok(blogId);
    }



    /**
     * 点赞功能
     *
     * @param id 博客的id
     * @return 点赞的结果
     */
    @OptLogger(value = UPDATE)
    @Limit(key = "like:")
    @PutMapping("/like/{id}")
    @ApiOperation(value = "博客点赞功能")
    public Result likeBlog(@PathVariable("id") Long id) {
        // 修改点赞数量
        blogService.likeBlog(id);
        return Result.ok();
    }


    /**
     * 查询这个自己的发布的所有笔记
     * @param current 发布的笔记总数目
     * @return 查询结果
     */
    @GetMapping("/of/me")
    @ApiOperation(value = "查询这个自己的发布的所有笔记")
    public Result queryMyBlog(@RequestParam(value = "current", defaultValue = "1") Integer current) {
        List<Blog> records =  blogService.queryMyBlog(current);
        return Result.ok(records);
    }

    /**
     * 查询所有博客的发布者信息以及当前用户有没有对这篇博客点过赞
     * @param current 发布的笔记总数目
     * @return 查询结果
     */
    @GetMapping("/hot")
    @ApiOperation(value = "查询所有博客的发布者信息")
    public Result queryHotBlog(@RequestParam(value = "current", defaultValue = "1") Integer current) {
        List<Blog> blogs = blogService.queryHotBlog(current);
        return Result.ok(blogs);
    }

    /**
     * 查询博客详细信息
     * @param id 博客的id
     * @return 查询到的博客
     */
    @GetMapping("/{id}")
    @ApiOperation(value = "查询博客详细信息")
    public Result queryBlogById(@PathVariable("id") Long id) {
        Blog blog =  blogService.queryBlogById(id);
        return Result.ok(blog);
    }

    /**
     * 查询点赞人数排行榜
     * @param id 博客的id
     * @return 查询结果
     */
    @GetMapping("/likes/{id}")
    @ApiOperation(value = "查询点赞人数排行榜")
    public Result queryBlogLikes(@PathVariable("id") Long id){
        List<UserDTO> userDTos = blogService.queryBlogLikes(id);
        return Result.ok(userDTos);

    }


    /**
     * 查询这个用户的发布的所有笔记
     * @param current 发布的笔记总数目
     * @param id 用户的id
     * @return 查询结果
     */
    @GetMapping("/of/user")
    @ApiOperation(value = "查询这个用户的发布的所有笔记")
    public Result queryBlogByUserId(
            @RequestParam(value = "current", defaultValue = "1") Integer current,
            @RequestParam("id") Long id) {

        List<Blog> blogs = blogService.queryBlogByUserId(current, id);
        return Result.ok(blogs);
    }

    /**
     * 关注里面展示推送的博客信息(滚动箱模式)
     * @param max 上一次查询的最小时间
     * @param offset 偏移量
     * @return 返回滚动箱数据
     */
    @GetMapping("/of/follow")
    @ApiOperation(value = "关注里面展示推送的博客信息(滚动箱模式)")
    public Result queryBlogOfFollow(
            @RequestParam("lastId") Long max, @RequestParam(value = "offset", defaultValue = "0") Integer offset){
        ScrollResult scrollResult = blogService.queryBlogOfFollow(max, offset);
        return Result.ok(scrollResult);
    }


}
